package com.yb.custom.annotation.log.filter;

import com.yb.custom.annotation.log.wrapper.MyRequestWrapper;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Objects;

/**
 * 这样做的目的是后续操作可以获取到流
 * 其他的情况可以直接使用new MyRequestWrapper来获取处理后的流
 *
 * @author yangbiao
 * @date 2022/3/31
 */
@Component
public class MyRepeatStreamFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        ServletRequest requestWrapper = null;
        if (request instanceof HttpServletRequest) {
            request.setCharacterEncoding(StandardCharsets.UTF_8.name());
            requestWrapper = new MyRequestWrapper((HttpServletRequest) request);
        }

        if (Objects.isNull(requestWrapper)) {
            filterChain.doFilter(request, response);
        } else {
            //因为当时POST请求的json请求体提交的时候,需要使用请求对象获取请求参数,
            //这里需要使用包装类拷贝一份请求传给下一个过滤器,这样就不会因为使用请求
            //对象获取请求参数导致接口无法使用而导致无法接收到参数的问题
            filterChain.doFilter(requestWrapper, response);
        }

    }

}
